package jp.ac.u_tokyo.dch.service;

import java.util.HashMap;
import java.util.Map;

import jp.ac.u_tokyo.dch.core.db.DBConnection;
import jp.ac.u_tokyo.dch.core.exceptions.DBException;
import jp.ac.u_tokyo.dch.dao.common.PsiDao;
import jp.ac.u_tokyo.dch.dao.psi.PsiInterfaceDao;
import jp.ac.u_tokyo.dch.model.PageInfo;
import jp.ac.u_tokyo.dch.model.PsiSearch;
import jp.ac.u_tokyo.dch.model.xml.psi.Psi;
import jp.ac.u_tokyo.dch.model.xml.psi.PsiObject;
import jp.ac.u_tokyo.dch.util.common.PsiPageUtil;

public class PsiService {

	public PageInfo<PsiObject> searchPsi(PsiSearch search) throws Exception {

		Map<String, String> params = new HashMap<String, String>();

		params.put("name_jp", search.getName_jp());
		params.put("name_kana", search.getName_kana());
		params.put("name_eng", search.getName_eng());
		params.put("alias_jp", search.getAlias_jp());
		params.put("alias_kana", search.getAlias_kana());
		params.put("alias_eng", search.getAlias_eng());
		params.put("latitude", search.getLatitude());
		params.put("longitude", search.getLongitude());
		params.put("birth_from", search.getBirth_from());
		params.put("birth_to", search.getBirth_to());
		params.put("death_from", search.getDeath_from());
		params.put("death_to", search.getDeath_to());
		params.put("person_url", search.getPerson_url());
		params.put("relatede_url", search.getRelatede_url());
		params.put("psi", search.getPsi());
		params.put("desc", search.getDesc());
		params.put("sortkey", search.getSortkey());

		PsiPageUtil pageUtil = new PsiPageUtil();

		return pageUtil.createPageInfo(search.getCurrentPage(), search.getViewPageCnt(), params);
	}


	public Psi searchByPsi(String psi) throws Exception {

		PsiInterfaceDao psiInterfaceDao = new PsiInterfaceDao();

		return psiInterfaceDao.selectById(psi);
	}

	/**
	 *
	 * @param psi
	 * @return 0:正常、1:エラー、2:重複エラー
	 * @throws DBException
	 */
	public Psi insert(DBConnection dbconn, PsiObject psi) throws DBException {


		PsiInterfaceDao psiInterfaceDao = new PsiInterfaceDao();

		Psi resultPsi = psiInterfaceDao.insert(psi);

		if (!"err".equals(resultPsi.getResponse().getStatus())) {

			PsiDao psiDao = new PsiDao(dbconn);

			psiDao.insert(resultPsi.getResponse().getResponseData().getPsi(), psi.getName_jp());
		}

		return resultPsi;
	}
	/**
	 *
	 * @param psi
	 * @return 0:正常、1:エラー、2:編集対象のpsiがない、3:他のプロセスから同PSIに対して更新があるため、本削除は無効
	 * @throws DBException
	 */
	public Psi update(DBConnection dbconn, PsiObject psi) throws DBException {

		PsiInterfaceDao psiInterfaceDao = new PsiInterfaceDao();

		Psi resultPsi =  psiInterfaceDao.update(psi);

		if (!"err".equals(resultPsi.getResponse().getStatus())) {

			PsiDao psiDao = new PsiDao(dbconn);

			psiDao.update(resultPsi.getResponse().getResponseData().getPsi(), psi.getName_jp());
		}
		return resultPsi;
	}

	/**
	 *
	 * @param psi
	 * @return 0:正常、1:エラー、2:編集対象のpsiがない、3:他のプロセスから同PSIに対して更新があるため、本削除は無効
	 */
	public Psi delete(PsiObject psi) {

		PsiInterfaceDao psiInterfaceDao = new PsiInterfaceDao();

		return psiInterfaceDao.delete(psi);

	}
}
